package com.example.ai.service;

import org.springframework.ai.chat.ChatClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

/**
 * 智能客服服务类，用于处理与电商相关的客户咨询
 * 限制AI的回答范围为电商领域的问题
 */
@Service
public class CustomerServiceChatbot {
    
    private final ChatClient chatClient;
    private final EcommerceService ecommerceService;
    
    // 系统提示词，限制AI的回答范围
    private static final String SYSTEM_PROMPT = "你是一个专业的电商客服助手，你的名字叫小智。" +
            "你需要严格按照以下规则回答用户问题：\n" +
            "1. 只回答与电商购物、商品咨询、订单查询、售后服务等相关的问题。\n" +
            "2. 对于非电商领域的问题，礼貌地拒绝回答，并引导用户回到电商相关话题。\n" +
            "3. 回答要友好、专业、简洁明了，使用亲切的语气。\n" +
            "4. 如果你不确定某个问题的答案，可以表示'抱歉，这个问题我暂时无法为您解答，请您提供更多信息'。\n" +
            "5. 不要提及你是AI助手，以第一人称回答用户问题。\n" +
            "6. 回答开头不需要使用称呼，直接回答问题内容。";
    
    // 会话历史记录，用于多轮对话
    private final Map<String, StringBuilder> conversationHistory = new HashMap<>();
    
    @Autowired
    public CustomerServiceChatbot(ChatClient chatClient, EcommerceService ecommerceService) {
        this.chatClient = chatClient;
        this.ecommerceService = ecommerceService;
    }
    
    /**
     * 处理用户咨询，返回AI客服的回答
     */
    public String handleCustomerQuery(String userId, String query) {
        // 构建完整的提示词
        StringBuilder promptBuilder = new StringBuilder();
        promptBuilder.append(SYSTEM_PROMPT).append("\n\n");
        
        // 获取并添加会话历史
        StringBuilder history = conversationHistory.computeIfAbsent(userId, k -> new StringBuilder());
        if (history.length() > 0) {
            promptBuilder.append(history).append("\n\n");
        }
        
        // 添加当前问题
        promptBuilder.append("用户：").append(query).append("\n小智：");
        
        // 调用AI生成回答
        String response = chatClient.prompt(promptBuilder.toString());
        
        // 更新会话历史（限制历史长度，避免token过多）
        updateConversationHistory(userId, query, response);
        
        return response;
    }
    
    /**
     * 更新会话历史
     */
    private void updateConversationHistory(String userId, String query, String response) {
        StringBuilder history = conversationHistory.get(userId);
        
        // 添加新的对话内容
        history.append("用户：").append(query).append("\n小智：").append(response).append("\n");
        
        // 如果历史记录过长，清理部分旧内容（保留最近的5轮对话）
        if (history.length() > 1000) {
            int startIndex = findNthOccurrence(history.toString(), "\n\n", 3);
            if (startIndex > 0) {
                history.delete(0, startIndex + 2);
            }
        }
    }
    
    /**
     * 查找字符串中第n次出现的子串的位置
     */
    private int findNthOccurrence(String str, String substring, int n) {
        int pos = 0;
        int count = 0;
        
        while ((pos = str.indexOf(substring, pos)) != -1) {
            count++;
            if (count == n) {
                return pos;
            }
            pos += substring.length();
        }
        
        return -1;
    }
    
    /**
     * 清除指定用户的会话历史
     */
    public void clearConversationHistory(String userId) {
        conversationHistory.remove(userId);
    }
    
    /**
     * 获取商品信息的回答模板
     */
    public String getProductInfoResponse(String productId) {
        EcommerceService.Product product = ecommerceService.getProductById(productId);
        if (product == null) {
            return "抱歉，未找到您查询的商品信息。请您确认商品ID是否正确，或者提供更多关于商品的描述。";
        }
        
        StringBuilder response = new StringBuilder();
        response.append("您查询的商品信息如下：\n");
        response.append("商品名称：").append(product.getName()).append("\n");
        response.append("商品价格：¥").append(String.format("%.2f", product.getPrice())).append("\n");
        response.append("商品分类：").append(product.getCategory()).append("\n");
        response.append("商品描述：").append(product.getDescription()).append("\n\n");
        response.append("请问您对该商品还有其他疑问吗？");
        
        return response.toString();
    }
    
    /**
     * 获取订单状态的回答模板
     */
    public String getOrderStatusResponse(String orderId) {
        EcommerceService.Order order = ecommerceService.getOrderById(orderId);
        if (order == null) {
            return "抱歉，未找到您查询的订单信息。请您确认订单号是否正确，或者联系客服获取帮助。";
        }
        
        StringBuilder response = new StringBuilder();
        response.append("您的订单状态如下：\n");
        response.append("订单编号：").append(order.getOrderId()).append("\n");
        response.append("订单状态：").append(getOrderStatusText(order.getStatus())).append("\n");
        response.append("订单金额：¥").append(String.format("%.2f", order.getTotalAmount())).append("\n");
        response.append("商品数量：").append(order.getItems().size()).append("件\n\n");
        response.append("请问您还需要其他帮助吗？");
        
        return response.toString();
    }
    
    /**
     * 将订单状态转换为友好的文本描述
     */
    private String getOrderStatusText(String status) {
        switch (status) {
            case "PENDING":
                return "待支付";
            case "PAID":
                return "已支付";
            case "SHIPPED":
                return "已发货";
            case "DELIVERED":
                return "已送达";
            case "CANCELLED":
                return "已取消";
            default:
                return status;
        }
    }
}